非同步通訊端適用於大量使用網路的系統,或是無法等候網路作業完成再繼續進行的系統,讓多個連線執行緒同時作業不必等待,可避免玩家畫面像是卡住的現象,以及避免資料同時做運算處理,因而造成資料的運算結果有誤。在伺服器中 TCP Listener 的非同步方法需要用到BeginAcceptTcpClient & EndAcceptTcpClient 的方法來進行通訊,而客戶端則是使用 BeginConnect 及 EndConnect。伺服器端每次與客戶取得連線要重新打開監聽,客戶端則不用,並使用IAsyncResult 來儲存及呼叫資料參數AsyncCallBack。
/// <summary>Handles new TCP connections.</summary>
private static void TCPConnectCallback(IAsyncResult _result)
{
TcpClient _client = tcpListener.EndAcceptTcpClient(_result);
tcpListener.BeginAcceptTcpClient(TCPConnectCallback, null);
for (int i = 1; i <= MaxPlayers; i++)
{
if (clients[i].tcp.socket == null)
{
clients[i].tcp.Connect(_client);
return;
}
}
Debug.Log($"{_client.Client.RemoteEndPoint} failed to connect: Server full!");
}
/// <summary>Initializes the newly connected client's TCP-related info.</summary>
private void ConnectCallback(IAsyncResult _result)
{
socket.EndConnect(_result);
if (!socket.Connected)
{
return;
}
stream = socket.GetStream();
receivedData = new Packet();
stream.BeginRead(receiveBuffer, 0, dataBufferSize, ReceiveCallback, null);
}